package DataStructure.arrayRelevant.matrix;

import Common.Utils.UTFactory;
import org.junit.Test;

/**
 * @author 蔚蔚樱
 * @version V1.0
 * @date 2022/11/16 23:02
 * @author—Email micromicrohard@outlook.com
 * @blogURL https://blog.csdn.net/Micro_Micro_Hard
 * @description 岛屿数量
 * 给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。
 * 岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
 * 此外，你可以假设该网格的四条边均被水包围。
 * @blogURL https://leetcode.cn/problems/number-of-islands/
 */
public class IslandNum {

    @Test // 验证功能：从数据库获取测试数据，用于单元测试
    public void TestFunc() throws Exception {
        UTFactory.FullTest(this.getClass());
    }

    @Test // 调试功能 : 用于复现错误的测试案例
    public void DoubleTrack() throws Exception {
        String input = "";
        String output = "";
        UTFactory.DebugTest(this.getClass(), input, output);
    }

    public int CountMethod(int[][] islandMatrix) {
        if (islandMatrix == null || islandMatrix.length == 0) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < islandMatrix.length; i++) {
            for (int j = 0; j < islandMatrix[i].length; j++) {
                if (islandMatrix[i][j] == 0) {
                    continue;
                }
                roll(islandMatrix, i, j);
                count++;
            }
        }
        return count;
    }

    public void roll(int[][] islandMatrix, int row, int column) {
        if (row < 0 || column < 0 || row >= islandMatrix.length || column >= islandMatrix[row].length) {
            return;
        }
        if (islandMatrix[row][column] == 0) {
            return;
        }
        islandMatrix[row][column] = 0;
        roll(islandMatrix, row + 1, column);
        roll(islandMatrix, row - 1, column);
        roll(islandMatrix, row, column + 1);
        roll(islandMatrix, row, column - 1);
    }
}
